package chapter05

/**
  * create by undeRdoG on  2021-05-30  17:42
  * 凡心所向，素履以往，生如逆旅，一苇以航。
  */
object Test06_HighOrderFunction {

  def main(args: Array[String]): Unit = {

    def f(n: Int): Int = {
      println("f被调用")
      n + 1
    }

    val i: Int = f(123)
    println(i)


    // 1. 将函数作为值进行传递
    /**
      * f _   函数名称 _ 表示将该函数赋给变量 f1
      * 而 Int => Int  表示该函数的  入参为 Int   返回值为Int
      * 如果申明了  Int => Int  那么 直接 f 即可，无需 _
      **/
    val f1 = f _
    val f2: Int => Int = f

    /*  chapter05.Test06_HihgOrderFunction$$$Lambda$5/532445947@4cdbe50f
        f被调用
      27*/
    println(f1)
    println(f1(26))


    def fun(): Int = {
      println("fun 调用")
      1
    }


    val f3 = fun
    val f4 = fun _
    // 显示的声明 f5 为一个函数
    val f5: () => Unit = fun

    /*    1
        chapter05.Test06_HihgOrderFunction$$$Lambda$7/1537358694@2ff4f00f
        可以看出：
        f3  为一次函数的调用
        f4  为一个函数对象
        */
    println(f3)
    println(f4)


    //(2) 函数可以作为参数进行传递
    // 定义一个二元运算函数     将函数作为参数传入
    def dualEval(op: (Int, Int) => Int,a: Int,b: Int): Int = {
      op(a,b)
    }

    def add(a: Int,b: Int): Int = {
      a + b
    }

    val res = dualEval(add,3,4)
    println(res)


    val res1 = dualEval( _ + _,2,3)
    println(res1)

    val res2 = dualEval((a,b) => {
      a + b
    },5,6)
    println(res2)


    val  res3 = dualEval((a,b) => a+b,9,1)
    println(res3)


    //(3) 函数可以作为函数的返回值

    def f6(): Int => Unit = {
      def f7(a: Int) : Unit = {
        println("f7调用" + a)
      }
      f7     // 将函数直接返回
    }

    // chapter05.Test06_HighOrderFunction$$$Lambda$13/240650537@1cd072a9
    println(f6)

    val m = f6
    //  f7调用10
    m(10)

    //f7调用150
    f6.apply(150)


  }


}
